home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume90
/
util
/
bsindex1
/
part01
/
src
/
bbsindex.h
< prev
next >
Wrap
C/C++ Source or Header
|
1990-02-02
|
12KB
|
347 lines
/*
* BBSINDEX.H
*
* All the standard variables and other stuff used by all the modules
* of BBSindex, and standard BBS-PC! headers (with a few modifications).
*
* Important note: This header file cannot be precompiled with
* Lattice C V5.02, because of a bug which prevents bit fields
* from working properly when they are precompiled.
*/
#include "bbs.h"
#define TRUE 1
#define FALSE 0
#define BTOK(x) (((x)+1023)>>10) /* Convert file size into K */
/*
* Default values for command line parameters and script commands
*/
#define FORMAT "%15n %w %-6x-%b{B,T} %c\n"
#define UDNAME "UDHEAD.DAT"
#define CFGNAME "CFGINFO.DAT"
#define PROGSCRIPT "BBSCRIPT"
#define DEFSCRIPT "BBSindex.scr"
/*
* Blocksize determines the largest contiguous memory segment which is
* needed. Larger values give faster processing, but need more continuous
* memory.
*/
#define BLOCKSIZE 160 /* Number of records/block (~16K) */
#define MAXOUT 1024 /* The maximum length of an output line */
#define MAXCOM 1024 /* Maximum size of a single command */
#define MAXSUB 256 /* Maximum size of a sub format string */
#define FRAGBLOCK 8192 /* Memory block to allocate in mymalloc */
#define FRAGTHRESH 200 /* Threshold for mem reqs in mymalloc */
#define BUFSIZE 8192 /* Maximum size of output buffer */
#define MAXEXPR 100 /* Max number of items in an expression */
#define MAXDIRENT 1000 /* Maximum number of unknown dir files */
#define DIRFRAG 100 /* Number of dir entries/block alloced */
#define DIRNAMESIZE 80 /* Maximum length of directory name */
#define MACROLEN 20 /* Maximum length of macro name */
#define MAXMACRO 50 /* Maximum number of macros allowed */
#define MAXNEST 10 /* Max number of macro nesting levels */
#define MAXCONST 20 /* Maximum length of a constant name */
/* Note: MAXSUB above is allocated on the stack, so don't make it too big */
/*
* This structure is used to build a tree structure representing
* the expression given with the SELECT command.
*/
struct expr {
int field; /* Field to test, or boolean operator */
int op; /* Operator to test against, if any */
int num; /* First data field */
char *text; /* Second data field */
struct expr *left; /* Left subtree */
struct expr *right; /* Right subtree */
};
typedef struct expr EXPR;
/*
* This structure is used to hold the name of a file found in
* a BBS-PC! file directory during CHECKFILES, which does not
* exist in the BBS-PC! file catalogue.
*/
typedef struct {
char name[32]; /* Disk filename */
short date; /* In BBS-PC! format, max 16 bits */
short dirnum; /* The directory number it was in */
long size; /* The size of the file, in bytes */
} DIRENTRY;
#define DIRENTRYSIZE sizeof(DIRENTRY)
/*
* This structure holds the names of files to be "ignored" during a
* CHECKFILES. I.e. they are marked as valid, even if their filesize
* on disk doesn't match that in the file catalogue. This structure
* is built up with the IGNORE command.
*/
struct ignore {
struct ignore *next;
char name[CAT_LEN+1];
};
typedef struct ignore IGNORE;
/*
* This structure is used to store macro definitions. Note that
* a single block is used to store both the macro and its definition.
* The structure is dynamically sized at runtime, to fit whatever
* size definition is given. The text[] array (nominally 1) gets
* expanded to hold the definition.
*/
typedef struct {
char name[MACROLEN]; /* Name of this macro */
int size; /* Size of macro text */
char text[1]; /* Start of macro text */
} MACRO;
#define MACROSIZE (sizeof(MACRO) - 1) /* The -1 is for text[1] */
/*
* This structure holds a block of parameters for a macro that is
* executing.
*/
typedef struct {
int size; /* Size of parameter block */
char params[1]; /* Start of parameter block */
} PARAM;
#define PARAMSIZE (sizeof(PARAM) - 1) /* The -1 is for params[1] */
/*
* This macro checks to make sure that the file database has been
* read in. This is delayed until as late as possible, so that if
* the script file contains errors, the errors will be spotted BEFORE
* the database is read in. The primary goal here is to save the user
* having to wait for 200K or so of database to be read in, just so
* they can see they have an error in their script. Instead, the
* database is only read in when a command cannot execute without
* having access to the files. Such commands are SORT, SCAN, LIST,
* CHECKFILES and FOREIGN.
*/
#define CHECKDATABASE() {if (!readfiles) readdatabase(databasename);}
/*
* Global variables, accessible to all modules
*/
#ifdef GLOBAL
#undef GLOBAL
#endif
#ifdef MAIN
#define GLOBAL
#else
#define GLOBAL extern
#endif
GLOBAL char *script; /* Array for storing the script */
GLOBAL long scriptsize; /* The size of the current script */
GLOBAL long scriptpos; /* Position in the current script */
GLOBAL long linenum; /* Line number in script file */
GLOBAL char out[MAXOUT]; /* Array for storing the output lines */
GLOBAL char combuf[MAXCOM]; /* Buffer to hold a single command */
GLOBAL char formatstring[MAXCOM];/* Used to store the output format string */
GLOBAL char databasename[256]; /* The name of the BBS-PC! file database */
GLOBAL char configname[256]; /* The name of the BBS-PC! config file */
GLOBAL char scriptname[256]; /* The name of the current script file */
GLOBAL UDHEAD **ptrblock; /* Array of pointers to file records */
GLOBAL long numrecs; /* The number of file headers read in */
GLOBAL long compos; /* Position on the current command line */
GLOBAL long comlen; /* Length of current command line */
GLOBAL BPTR outfile; /* Output file (Default is stdout) */
GLOBAL BPTR errorfile; /* Standard error file (screen usually) */
GLOBAL BPTR dirlock; /* Lock used when scanning directories */
GLOBAL struct FileInfoBlock *fib;/* Global fib struct on longword boundary */
GLOBAL int checkfiles; /* TRUE if file directories were scanned */
GLOBAL int readfiles; /* TRUE if database file has been read in */
GLOBAL int toscreen; /* TRUE if output is to screen */
GLOBAL int totalbytes; /* Total number of bytes output so far */
GLOBAL int totalfiles; /* Total number of files output so far */
GLOBAL int curbytes; /* Number of bytes output by last LIST/SCAN */
GLOBAL int curfiles; /* Number of files output by last LIST/SCAN */
GLOBAL int sorted; /* True if file array has been sorted */
GLOBAL EXPR tree[MAXEXPR]; /* Array to hold parsed SELECT expression */
GLOBAL int numdirentries; /* Number of fake directory entries */
GLOBAL DIRENTRY *direntries[MAXDIRENT];/* Storage for ptrs to dir entries */
GLOBAL char dirnames[NUM_SECT][DIRNAMESIZE];/* Storage for directory names */
GLOBAL CFGINFO config[1]; /* BBS-PC! Configuration file structure */
GLOBAL MACRO *macros[MAXMACRO]; /* Array of ptrs to macro definitions */
GLOBAL int nummacros; /* Number of macros currently defined */
GLOBAL PARAM *params[MAXNEST]; /* Array of pointers to macro parameters */
GLOBAL int nestlevel; /* Current macro nest level */
GLOBAL int tracemode; /* Trace mode; TRUE if tracing enabled */
GLOBAL IGNORE *firstignore; /* Pointer to first filename to ignore */
/*
* Global functions, accessible everywhere
*/
char *format(); /* Format output string from file header + format spec */
char *echoformat(); /* Formats output string for ECHO command */
char *itoa(); /* Convert integer into ASCII format */
char *getstring(); /* Get next string from command buffer */
void *mymalloc(); /* Safe memory tracker that handles out of memory */
void *SafeAllocMem();/* Safe AllocMem that handles out of memory */
void execscript(); /* Executes all the commands in the current script */
void Cleanup(); /* Frees resources and exits program */
void chkabort(); /* Checks for Control-C, and aborts if detected */
void putstring(); /* Outputs string to standard I/O */
void flushout(); /* Flushes data buffer to output file */
void parse(); /* Parse command line and build expression tree */
void readdatabase();/* Reads in the BBS-PC! UDHEAD.DAT file database */
void readconfigfile();/* Reads in the BBS-PC! CFGINFO.DAT file */
void print(); /* Prints a string to stderr */
void com_select(); /* SELECT, specifies criteria for files to select */
void com_checkfiles();/* Scans file directories, updating catlague entries */
void com_sort(); /* Sorts file catalogue into a particular order */
void com_foreign(); /* Prints a list of all the unknown foreign files */
void com_norequest();/* Stop AmigaDos from putting up requesters */
int match(); /* Returns TRUE if record matches current selection */
int scandir(); /* Scans directory for files, returns TRUE if continue */
int sortcmp(); /* Internal routine used for sorting files */
/*
* print3()
* --------
* Prints 3 strings to standard error
*/
#define print2(s1,s2) (print(s1), print(s2))
#define print3(s1,s2,s3) (print(s1), print(s2), print(s3))
/*
* The list of identifiers used by SORT and SELECT.
*/
#define MAXINDEX 16
#define I_ANY 0
#define I_ACCESS 1
#define I_BINARY 2
#define I_COMMENT 3
#define I_DISKNAME 4
#define I_SECTION 5
#define I_ONLINE 6
#define I_LOCAL 7
#define I_NAME 8
#define I_OWNER 9
#define I_PATHNAME 10
#define I_DIRECTORY 11
#define I_DISKDIRNUM 12
#define I_VALID 13
#define I_DATE 14
#define I_SIZE 15
#define I_KSIZE 16
GLOBAL struct {
int tag;
char *name;
} indexes[MAXINDEX]
#ifdef MAIN
= {
{ I_ACCESS, "ACCESS"}, /* Number of times file was accessed */
{ I_BINARY, "BINARY"}, /* True if Binary, False if text */
{ I_COMMENT, "COMMENT"}, /* The file comment */
{ I_DISKNAME, "DISKNAME"}, /* The name of the file on disk */
{ I_SECTION, "SECTION"}, /* # of the section the file is in */
{ I_ONLINE, "ONLINE"}, /* True if file online */
{ I_LOCAL, "LOCAL"}, /* True if file uploaded locally */
{ I_NAME, "NAME"}, /* The name of the file in the catalog */
{ I_OWNER, "OWNER"}, /* The name of uploader of the file */
{ I_PATHNAME, "PATHNAME"}, /* Pathname to file on disk */
{ I_DIRECTORY, "DIRECTORY"}, /* # of directory file is in */
{ I_DISKDIRNUM, "DISKDIRNUM"}, /* # of disk directory file is in */
{ I_VALID, "VALID"}, /* True if file is Valid */
{ I_DATE, "DATE"}, /* The date the file was uploaded */
{ I_SIZE, "SIZE"}, /* The size of the file */
{ I_KSIZE, "KSIZE"} /* The size of the file in K */
}
#endif
;
GLOBAL char *months[]
#ifdef MAIN
= {
"xxx",
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
}
#endif
;
/*
* Special characters that can occur in the script
*/
#define CHAR_TAB '\t'
#define CHAR_SPACE ' '
#define CHAR_HASH '#'
#define CHAR_NL '\n'
#define CHAR_ESC '\\'
#define CHAR_QUOTE '\''
#define CHAR_QUOTES '\"'
#define CHAR_SEMI ';'
#define CHAR_COMMA ','
#define CHAR_EQUALS '='
#define CHAR_DOLLAR '$'
#define CHAR_NULL '\0'
#define CHAR_ASCEND '+'
#define CHAR_DESCEND '-'
/*
* The following symbols are used in the expression tree
*/
/*
* Boolean operations, which share storage with field selectors
*/
#define E_AND 30 /* <left> AND <right> */
#define E_OR 31 /* <left> OR <right> */
#define E_NOT 32 /* NOT <left> */
#define E_ALL 33 /* Always true */
/*
* Comparison operators, used for comparing record elements
*/
#define E_EQ 34 /* Record == Value */
#define E_NE 35 /* Record != Value */
#define E_LT 36 /* Record < Value */
#define E_GT 37 /* Record > Value */
#define E_LE 38 /* Record <= Value */
#define E_GE 39 /* Record >= Value */
#define E_OPENPAR 40 /* Open parameter token */
#define E_CLOSEPAR 41 /* Close parameter token */
#define E_NUMBER 42 /* Any numeric value */
#define E_STRING 43 /* Anything in quotes */
#define E_END 44 /* End of command line */
#define E_TEXT 45 /* File is a text file */
#define E_REMOTE 46 /* File is a remote file */
#define E_INVALID 47 /* File is invalid */
#define E_OFFLINE 48 /* File is offline */
/*
* Wildcard special fields for strings
*/
#define tokentowild(x) ((x)+50)
#define W_OWNER tokentowild(I_OWNER)
#define W_NAME tokentowild(I_NAME)
#define W_DISKNAME tokentowild(I_DISKNAME)
#define W_COMMENT tokentowild(I_COMMENT)